// This file was generated AUTOMATICALLY from a template file Fri Apr 01 01:01:38 PDT 2016
/*
 * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.nulldev.util.VariableAPI.util.strings.codepoint;

/**
 * The CharacterData class encapsulates the large tables found in
 * Java.lang.Character.
 */

class CharacterDataLatin1 extends CharacterData {

	/*
	 * The character properties are currently encoded into 32 bits in the following
	 * manner: 1 bit mirrored property 4 bits directionality property 9 bits signed
	 * offset used for converting case 1 bit if 1, adding the signed offset converts
	 * the character to lowercase 1 bit if 1, subtracting the signed offset converts
	 * the character to uppercase 1 bit if 1, this character has a titlecase
	 * equivalent (possibly itself) 3 bits 0 may not be part of an identifier 1
	 * ignorable control; may continue a Unicode identifier or Java identifier 2 may
	 * continue a Java identifier but not a Unicode identifier (unused) 3 may
	 * continue a Unicode identifier or Java identifier 4 is a Java whitespace
	 * character 5 may start or continue a Java identifier; may continue but not
	 * start a Unicode identifier (underscores) 6 may start or continue a Java
	 * identifier but not a Unicode identifier ($) 7 may start or continue a Unicode
	 * identifier or Java identifier Thus: 5, 6, 7 may start a Java identifier 1, 2,
	 * 3, 5, 6, 7 may continue a Java identifier 7 may start a Unicode identifier 1,
	 * 3, 5, 7 may continue a Unicode identifier 1 is ignorable within an identifier
	 * 4 is Java whitespace 2 bits 0 this character has no numeric property 1 adding
	 * the digit offset to the character code and then masking with 0x1F will
	 * produce the desired numeric value 2 this character has a "strange" numeric
	 * value 3 a Java supradecimal digit: adding the digit offset to the character
	 * code, then masking with 0x1F, then adding 10 will produce the desired numeric
	 * value 5 bits digit offset 5 bits character type
	 * 
	 * The encoding of character properties is subject to change at any time.
	 */

	int getProperties(int ch) {
		char offset = (char) ch;
		int props = A[offset];
		return props;
	}

	int getPropertiesEx(int ch) {
		char offset = (char) ch;
		int props = B[offset];
		return props;
	}

	boolean isOtherLowercase(int ch) {
		int props = getPropertiesEx(ch);
		return (props & 0x0001) != 0;
	}

	boolean isOtherUppercase(int ch) {
		int props = getPropertiesEx(ch);
		return (props & 0x0002) != 0;
	}

	boolean isOtherAlphabetic(int ch) {
		int props = getPropertiesEx(ch);
		return (props & 0x0004) != 0;
	}

	boolean isIdeographic(int ch) {
		int props = getPropertiesEx(ch);
		return (props & 0x0010) != 0;
	}

	int getType(int ch) {
		int props = getProperties(ch);
		return (props & 0x1F);
	}

	boolean isJavaIdentifierStart(int ch) {
		int props = getProperties(ch);
		return ((props & 0x00007000) >= 0x00005000);
	}

	boolean isJavaIdentifierPart(int ch) {
		int props = getProperties(ch);
		return ((props & 0x00003000) != 0);
	}

	boolean isUnicodeIdentifierStart(int ch) {
		int props = getProperties(ch);
		return ((props & 0x00007000) == 0x00007000);
	}

	boolean isUnicodeIdentifierPart(int ch) {
		int props = getProperties(ch);
		return ((props & 0x00001000) != 0);
	}

	boolean isIdentifierIgnorable(int ch) {
		int props = getProperties(ch);
		return ((props & 0x00007000) == 0x00001000);
	}

	int toLowerCase(int ch) {
		int mapChar = ch;
		int val = getProperties(ch);

		if (((val & 0x00020000) != 0) && ((val & 0x07FC0000) != 0x07FC0000)) {
			int offset = val << 5 >> (5 + 18);
			mapChar = ch + offset;
		}
		return mapChar;
	}

	int toUpperCase(int ch) {
		int mapChar = ch;
		int val = getProperties(ch);

		if ((val & 0x00010000) != 0) {
			if ((val & 0x07FC0000) != 0x07FC0000) {
				int offset = val << 5 >> (5 + 18);
				mapChar = ch - offset;
			} else if (ch == 0x00B5) {
				mapChar = 0x039C;
			}
		}
		return mapChar;
	}

	int toTitleCase(int ch) {
		return toUpperCase(ch);
	}

	int digit(int ch, int radix) {
		int value = -1;
		if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {
			int val = getProperties(ch);
			int kind = val & 0x1F;
			if (kind == Character.DECIMAL_DIGIT_NUMBER) {
				value = ch + ((val & 0x3E0) >> 5) & 0x1F;
			} else if ((val & 0xC00) == 0x00000C00) {
				// Java supradecimal digit
				value = (ch + ((val & 0x3E0) >> 5) & 0x1F) + 10;
			}
		}
		return (value < radix) ? value : -1;
	}

	int getNumericValue(int ch) {
		int val = getProperties(ch);
		int retval = -1;

		switch (val & 0xC00) {
			default: // cannot occur
			case (0x00000000): // not numeric
				retval = -1;
				break;
			case (0x00000400): // simple numeric
				retval = ch + ((val & 0x3E0) >> 5) & 0x1F;
				break;
			case (0x00000800): // "strange" numeric
				retval = -2;
				break;
			case (0x00000C00): // Java supradecimal
				retval = (ch + ((val & 0x3E0) >> 5) & 0x1F) + 10;
				break;
		}
		return retval;
	}

	boolean isWhitespace(int ch) {
		int props = getProperties(ch);
		return ((props & 0x00007000) == 0x00004000);
	}

	byte getDirectionality(int ch) {
		int val = getProperties(ch);
		byte directionality = (byte) ((val & 0x78000000) >> 27);

		if (directionality == 0xF) {
			directionality = -1;
		}
		return directionality;
	}

	boolean isMirrored(int ch) {
		int props = getProperties(ch);
		return ((props & 0x80000000) != 0);
	}

	int toUpperCaseEx(int ch) {
		int mapChar = ch;
		int val = getProperties(ch);

		if ((val & 0x00010000) != 0) {
			if ((val & 0x07FC0000) != 0x07FC0000) {
				int offset = val << 5 >> (5 + 18);
				mapChar = ch - offset;
			} else {
				switch (ch) {
					// map overflow characters
					case 0x00B5:
						mapChar = 0x039C;
						break;
					default:
						mapChar = Internal.CHAR_ERROR;
						break;
				}
			}
		}
		return mapChar;
	}

	static char[] sharpsMap = new char[]
		{ 'S', 'S' };

	char[] toUpperCaseCharArray(int ch) {
		char[] upperMap =
			{ (char) ch };
		if (ch == 0x00DF) {
			upperMap = sharpsMap;
		}
		return upperMap;
	}

	static final CharacterDataLatin1 instance = new CharacterDataLatin1();

	private CharacterDataLatin1() {
	};

	// The following tables and code generated using:
	// java GenerateCharacter -template
	// c:/re/workspace/8-2-build-windows-amd64-cygwin/jdk8u91/6644/jdk/make/data/characterdata/CharacterDataLatin1.java.template
	// -spec
	// c:/re/workspace/8-2-build-windows-amd64-cygwin/jdk8u91/6644/jdk/make/data/unicodedata/UnicodeData.txt
	// -specialcasing
	// c:/re/workspace/8-2-build-windows-amd64-cygwin/jdk8u91/6644/jdk/make/data/unicodedata/SpecialCasing.txt
	// -proplist
	// c:/re/workspace/8-2-build-windows-amd64-cygwin/jdk8u91/6644/jdk/make/data/unicodedata/PropList.txt
	// -o
	// c:/re/workspace/8-2-build-windows-amd64-cygwin/jdk8u91/6644/build/windows-amd64/jdk/gensrc/java/lang/CharacterDataLatin1.java
	// -string -usecharforbyte -latin1 8
	// The A table has 256 entries for a total of 1024 bytes.

	static final int A[] = new int[256];
	static final String A_DATA = "\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800"
			+ "\u100F\u4800\u100F\u4800\u100F\u5800\u400F\u5000\u400F\u5800\u400F\u6000\u400F"
			+ "\u5000\u400F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800"
			+ "\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F"
			+ "\u4800\u100F\u4800\u100F\u5000\u400F\u5000\u400F\u5000\u400F\u5800\u400F\u6000"
			+ "\u400C\u6800\030\u6800\030\u2800\030\u2800\u601A\u2800\030\u6800\030\u6800"
			+ "\030\uE800\025\uE800\026\u6800\030\u2000\031\u3800\030\u2000\024\u3800\030"
			+ "\u3800\030\u1800\u3609\u1800\u3609\u1800\u3609\u1800\u3609\u1800\u3609\u1800"
			+ "\u3609\u1800\u3609\u1800\u3609\u1800\u3609\u1800\u3609\u3800\030\u6800\030"
			+ "\uE800\031\u6800\031\uE800\031\u6800\030\u6800\030\202\u7FE1\202\u7FE1\202"
			+ "\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1"
			+ "\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202"
			+ "\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1"
			+ "\202\u7FE1\uE800\025\u6800\030\uE800\026\u6800\033\u6800\u5017\u6800\033\201"
			+ "\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2"
			+ "\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201"
			+ "\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2"
			+ "\201\u7FE2\201\u7FE2\201\u7FE2\uE800\025\u6800\031\uE800\026\u6800\031\u4800"
			+ "\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u5000\u100F"
			+ "\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800"
			+ "\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F"
			+ "\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800"
			+ "\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F"
			+ "\u3800\014\u6800\030\u2800\u601A\u2800\u601A\u2800\u601A\u2800\u601A\u6800"
			+ "\034\u6800\030\u6800\033\u6800\034\000\u7005\uE800\035\u6800\031\u4800\u1010"
			+ "\u6800\034\u6800\033\u2800\034\u2800\031\u1800\u060B\u1800\u060B\u6800\033"
			+ "\u07FD\u7002\u6800\030\u6800\030\u6800\033\u1800\u050B\000\u7005\uE800\036"
			+ "\u6800\u080B\u6800\u080B\u6800\u080B\u6800\030\202\u7001\202\u7001\202\u7001"
			+ "\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202"
			+ "\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001"
			+ "\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\u6800\031\202\u7001\202"
			+ "\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\u07FD\u7002\201\u7002"
			+ "\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201"
			+ "\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002"
			+ "\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\u6800"
			+ "\031\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002" + "\u061D\u7002";

	// The B table has 256 entries for a total of 512 bytes.

	static final char B[] = ("\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
			+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000").toCharArray();

	// In all, the character property tables require 1024 bytes.

	static {
		{ // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
			char[] data = A_DATA.toCharArray();
			assert (data.length == (256 * 2));
			int i = 0, j = 0;
			while (i < (256 * 2)) {
				int entry = data[i++] << 16;
				A[j++] = entry | data[i++];
			}
		}

	}
}

